package com.fh.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class Watermark {
	
		private	static String strFWATERM,strIWATERM;
		
		static{
			strFWATERM = Tools.readTxtFile(Const.FWATERM);	//读取文字水印配置
			strIWATERM = Tools.readTxtFile(Const.IWATERM);	//读取图片水印配置
		}
		
		/**
		 * 刷新
		*/
		public static void fushValue(){
			strFWATERM = Tools.readTxtFile(Const.FWATERM);	//读取文字水印配置
			strIWATERM = Tools.readTxtFile(Const.IWATERM);	//读取图片水印配置
		}
			
		/**
		 * @param imagePath 图片全路径
		*/
	  	public static void setWatemark(String imagePath){ 
	  		//文字水印
	  		if(null != strFWATERM && !"".equals(strFWATERM)){
				String strFW[] = strFWATERM.split(",fh,");
				if(strFW.length == 5){
					if("yes".equals(strFW[0])){
						pressText(strFW[1].toString(), imagePath, "", 1, Color.RED,Integer.parseInt(strFW[2]), Integer.parseInt(strFW[3]), Integer.parseInt(strFW[4]));	//文字
					}
				}
			}
	  		//图片水印
			if(null != strIWATERM && !"".equals(strIWATERM)){
				String strIW[] = strIWATERM.split(",fh,");
				if(strIW.length == 4){
					if("yes".equals(strIW[0])){
						pressImage(PathUtil.getClasspath() + Const.FILEPATHIMG+strIW[1], imagePath, Integer.parseInt(strIW[2]), Integer.parseInt(strIW[3]));
					}
				}
			}
		  } 
	
	  
	  
	    /**
	     * 把图片印刷到图片上
	     * 
	     * @param pressImg --
	     *            水印文件
	     * @param targetImg --
	     *            目标文件
	     * @param x
	     *            --x坐标
	     * @param y
	     *            --y坐标
	     */
	    public final static void pressImage(String pressImg, String targetImg,
	            int x, int y) {
	        try {
	            //目标文件
	            File _file = new File(targetImg);
	            Image src = ImageIO.read(_file);
	            int wideth = src.getWidth(null);
	            int height = src.getHeight(null);
	            BufferedImage image = new BufferedImage(wideth, height,
	                    BufferedImage.TYPE_INT_RGB);
	            Graphics g = image.createGraphics();
	            g.drawImage(src, 0, 0, wideth, height, null);

	            //水印文件
	            File _filebiao = new File(pressImg);
	            Image src_biao = ImageIO.read(_filebiao);
	            int wideth_biao = src_biao.getWidth(null);
	            int height_biao = src_biao.getHeight(null);
	            //g.drawImage(src_biao, (wideth - wideth_biao) / 2,(height - height_biao) / 2, wideth_biao, height_biao, null);
	            g.drawImage(src_biao, x, y, wideth_biao, height_biao, null);
	            //水印文件结束
	            g.dispose();
	            FileOutputStream out = new FileOutputStream(targetImg);
	            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
	            encoder.encode(image);
	            out.close();
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }

	    /**
	     * 打印文字水印图片
	     * 
	     * @param pressText
	     *            --文字
	     * @param targetImg --
	     *            目标图片
	     * @param fontName --
	     *            字体名
	     * @param fontStyle --
	     *            字体样式
	     * @param color --
	     *            字体颜色
	     * @param fontSize --
	     *            字体大小
	     * @param x --
	     *            偏移量
	     * @param y
	     */

	    public static void pressText(String pressText, String targetImg,
	    		String fontName, int fontStyle, Color color, int fontSize, int x,int y) {
	        try {
	            File _file = new File(targetImg);
	            Image src = ImageIO.read(_file);
	            int wideth = src.getWidth(null);
	            int height = src.getHeight(null);
	            BufferedImage image = new BufferedImage(wideth, height,
	                    BufferedImage.TYPE_INT_RGB);
	            Graphics g = image.createGraphics();
	            g.drawImage(src, 0, 0, wideth, height, null);
	            g.setColor(color);
	            g.setFont(new Font(fontName, fontStyle, fontSize));
	            g.drawString(pressText, x, y);
	            g.dispose();
	            FileOutputStream out = new FileOutputStream(targetImg);
	            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
	            encoder.encode(image);
	            out.close();
	        } catch (Exception e) {
	            System.out.println(e);
	        }
	    }  
	    
	    /**
	     * 马赛克化.
	     * @param size  马赛克尺寸，即每个矩形的长宽
	     * @return
	     * @throws Exception
	     */
	    public static void mosaic(int size, String imagePath, String targetImg) throws Exception {
	        File file = new File(imagePath);
	        if (!file.isFile()) {
	            throw new Exception("ImageDeal>>>" + file + " 不是一个图片文件!");
	        }
	        BufferedImage bi = ImageIO.read(file); // 读取该图片
	        BufferedImage image = new BufferedImage(bi.getWidth(),
	                bi.getHeight(), bi.TYPE_INT_RGB);
	        if (bi.getWidth() < size || bi.getHeight() < size || size <= 0) { // 马赛克格尺寸太大或太小
	            return;
	        }
	 
	        int xcount = 0; // 方向绘制个数
	        int ycount = 0; // y方向绘制个数
	        if (bi.getWidth() % size == 0) {
	            xcount = bi.getWidth() / size;
	        } else {
	            xcount = bi.getWidth() / size + 1;
	        }
	        if (bi.getHeight() % size == 0) {
	            ycount = bi.getHeight() / size;
	        } else {
	            ycount = bi.getHeight() / size + 1;
	        }
	        int x = 0;   //坐标
	        int y = 0;
	        // 绘制马赛克(绘制矩形并填充颜色)
	        Graphics gs = image.getGraphics();
	        for (int i = 0; i < xcount; i++) {
	            for (int j = 0; j < ycount; j++) {
	                //马赛克矩形格大小
	                 int mwidth = size;
	                 int mheight = size;
	                 if(i==xcount-1){   //横向最后一个比较特殊，可能不够一个size
	                     mwidth = bi.getWidth()-x;
	                 }
	                 if(j == ycount-1){  //同理
	                     mheight =bi.getHeight()-y;
	                 }
	              // 矩形颜色取中心像素点RGB值
	                int centerX = x;
	                int centerY = y;
	                if (mwidth % 2 == 0) {
	                    centerX += mwidth / 2;
	                } else {
	                    centerX += (mwidth - 1) / 2;
	                }
	                if (mheight % 2 == 0) {
	                    centerY += mheight / 2;
	                } else {
	                    centerY += (mheight - 1) / 2;
	                }
	                Color color = new Color(bi.getRGB(centerX, centerY));
	                gs.setColor(color);
	                gs.fillRect(x, y, mwidth, mheight);
	                y = y + size;// 计算下一个矩形的y坐标
	            }
	            y = 0;// 还原y坐标
	            x = x + size;// 计算x坐标
	        }
	        gs.dispose();
//	        File sf = new File(saveUrl, saveName + "." + suffix);
//	        ImageIO.write(spinImage, suffix, sf); // 保存图片
	        FileOutputStream out = new FileOutputStream(targetImg);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(image);
            out.close();
	    }
	  
	public static void main(String[] args) {
		try {
			mosaic(4,"/Users/liangjing/Downloads/IMG_3299.JPG","/Users/liangjing/Downloads/IMG_2.JPG");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}
